/**
 * A JuzKezt reprezentáló osztály.
 */
public class Player extends Entity {
  /**
   * Belső változó amiben az éppen lerakásra váró bomba tárolódik.
   */
  Bomb bomb = null;

  /**
   * Mozgatja a játékost az adott irányba.
   * @param direction A mozgás iránya
   * @param depth A mozgás maximális mélysége.
   * @return True, ha a mozgás sikerült.
   */  
  public boolean move(int direction, int depth)
  {
    if(direction > 0)
    {
      Field targetField = field.getNeighbour(direction);
      if (targetField.isEmpty()) //Ha a célmező üres, léphetünk oda.
      {
        doMove(targetField, direction);
      }
      else
      {
        Entity targetEntity = targetField.getEntity();
        Boolean b = targetEntity.dig();
        if (b) //Ha ki lehet ásni, odaléphetünk
        {
          doMove(targetField, direction);
        }
        else
        {  //ha nem, aktiváljuk azt a mezőt, hátha olyan, akit ez érint (pl szörny)
          if (targetEntity.move(direction, depth-1))
          {
            doMove(targetField, direction);
          }
        }
      }
      for(int i = 1;i<7;i++)
      {
        Entity n = field.getNeighbour(i).getEntity();
        if(n != null)
          n.activate();
      }
      return true;
    }
    else
      return false;
  }

  /**
   * Belső függvény a mozgással kapcsolatos összes lépés végrehajtására.
   * (Ha van bomba Juzkeznél, leteszi a lépés után oda, ahol eddig állt.)
   * @param targetField A cél mező, ahová lépni kell.
   */
  private void doMove(Field targetField, int direction)
  {
    Field temp = field;
    field.delete();
    if (bomb != null)
    {
      field.add(bomb);

      field.getGame().getTimer().add(bomb);

      bomb = null;
    }
    targetField.add(this);

    System.out.println(this.toString() + " moved "+ direction);

    for(int i = 1;i<4;i++)
    {
      Field n = temp.getNeighbour(i);
      if(n != null && !n.isEmpty())
        n.getEntity().move(0, 0);
    }
  }

  /**
   * Kér egy új Bomb példányt a Game osztálytól.
   */
  public void setBomb()
  {
    bomb = field.getGame().createBomb();
  }

  /**
   * Megöli a játékost.
   * @return Mindig True
   */
  public boolean kill() 
  {
    System.out.println(toString() + " died");
    field.getGame().killPlayer();  
    return true;
  }

  /**
   * Kinyírja JuzKezt.
   * @return Mindíg True.
   */
  public boolean explode()
  {
    System.out.println(toString() + " died");
    field.getGame().killPlayer();
    return true;
  }

  /**
   * Kinyírja JuzKezt.
   * @return Mindíg True.
   */
  public boolean eat() 
  {
    System.out.println(toString() + " died");
    field.getGame().killPlayer();
    return true;
  }

  public String toString()
  {
    return "player["+ID+"]";
  }
}